/*
 * AlterarSenhaManagedBean.java
 * Versão: 1.0
 * Data de Criação : 18/08/2011
 * Copyright (c) 2008-2011 Universidade Estadual de
 * Londrina - UEL.
 * Rodovia Celso Garcia Cid, Cidade Universitária,
 * Londrina, Paraná
 * Brasil
 * Todos os direitos reservados.
 *
 * Este software é de informação confidenciais de
 * propriedade da UEL Univesidade Estadual de Londrina.
 * ("Informações Confidenciais "). Você não poderá
 * compartilhar estas informações por ser de carater
 * confidencial e usará somente em acordo com os termos de
 * licençada UEL
 */
package br.uel.ati.grad.bean;

import br.uel.ati.validacao.Senha;
import br.uel.ati.entity.grad.Usuario;
import br.uel.ati.facade.grad.UsuarioFacadeLocal;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import lombok.Data;

/**
 * Esta classe permite a alteração da senha corrente do usuário e sua validação
 * comparando o valor digitado na página web com o armazenado no banco de dados.
 *
 * @author Humberto Ferreira da Luz Junior
 * @version 1.0
 */
@ManagedBean
@RequestScoped
@Data
public class AlterarSenhaManagedBean {
    /**
     * Interface EJB utilizada para acessar o banco de dados.
     */
    @EJB
    private UsuarioFacadeLocal usuarioFacade;
    /**
     * E-mail atual digitado pelo usuário no formulário.
     */
    private String senhaAtual;
    /**
     * Novo e-mail digitado pelo usuário no formulário.
     */
    private String novaSenha;
    /**
     * Repetição da nova senha que deve ser digitada no formulário.
     */
    private String repeticaoNovaSenha;
    /**
     * Informações do usuário logado que está executando a ação.
     */
    private Usuario loggedUser;

    /**
     * Altera a senha do usuário.
     *
     * @return String que redireciona para a página index.xhtml de acordo com o faces.config.
     */
    public String alterarSenha() {
        loggedUser.setSenha(novaSenha);
        usuarioFacade.edit(loggedUser);
        return "index";
    }

    /**
     * Verifica se a senha atual digitada corresponde com a armazenada no banco 
     * de dados.
     *
     * @throws ValidatorException indica que a senha digitada pelo usuário não 
     * corresponde à que está a armazenada no BD.
     */
    public void validarSenhaAtual(FacesContext context, UIComponent component, Object value) {
        try {
            String senha = (String) value;
            String nome = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
            loggedUser = usuarioFacade.find(nome);
            if (!Senha.validarMD5(loggedUser.getSenha(), senha)) {
                FacesMessage message = new FacesMessage("Senha incorreta!");
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(message);
            }
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(AlterarSenhaManagedBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Limpa as variáveis do managed bean.
     *
     * @return String que redireciona para a página index.xhtml de acordo com o 
     * faces.config.
     */
    public String limpar() {
        senhaAtual = novaSenha = repeticaoNovaSenha = new String();
        loggedUser = new Usuario();
        return "home";
    }
}
